home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2006 December / PCWDEC06.iso / Software / Freeware / Gmail Manager 0.5.1 / gmanager051.xpi / components / gmCookies.js next >
Encoding:
Text File  |  2006-08-28  |  7.1 KB  |  216 lines

  1. // Gmail Manager
  2. // By Todd Long <longfocus@gmail.com>
  3. // http://www.longfocus.com/firefox/gmanager/
  4.  
  5. const GM_CC = Components.classes;
  6. const GM_CI = Components.interfaces;
  7.  
  8. function gmCookies()
  9. {
  10.   this._console = GM_CC['@mozilla.org/consoleservice;1'].getService(GM_CI.nsIConsoleService);
  11.   this._observer = GM_CC["@mozilla.org/observer-service;1"].getService(GM_CI.nsIObserverService);
  12.   this._sessions = new Array();
  13. }
  14.  
  15. gmCookies.prototype = {
  16.   loadSession: function(aHost)
  17.   {
  18.     if (this._sessions[aHost] == null)
  19.     {
  20.       this._sessions[aHost] = new Object();
  21.       
  22.       this._sessions[aHost].count = 1;
  23.       this._sessions[aHost].cookies = this._getCookies(aHost);
  24.       
  25.       // Load observers
  26.       this._observer.addObserver(this, "http-on-modify-request", false);
  27.       this._observer.addObserver(this, "http-on-examine-response", false);
  28.     }
  29.     else
  30.       this._sessions[aHost].count++;
  31.   },
  32.   
  33.   restoreSession: function(aHost)
  34.   {
  35.     if (this._sessions[aHost] != null)
  36.     {
  37.       this._sessions[aHost].count--;
  38.       
  39.       if (this._sessions[aHost].count == 0)
  40.       {
  41.         // Restores cookies
  42.         this._putCookies(aHost);
  43.         
  44.         // Reset data
  45.         this._sessions[aHost] = null;
  46.         
  47.         // Remove observers
  48.         this._observer.removeObserver(this, "http-on-modify-request");
  49.         this._observer.removeObserver(this, "http-on-examine-response");
  50.       }
  51.     }
  52.   },
  53.   
  54.   _getCookies: function(aHost)
  55.   {
  56.     var iioServ = GM_CC["@mozilla.org/network/io-service;1"].getService(GM_CI.nsIIOService);
  57.     var cookieManEnum = GM_CC["@mozilla.org/cookiemanager;1"].getService(GM_CI.nsICookieManager).enumerator;
  58.     var cookies = new Array();
  59.     
  60.     while (cookieManEnum.hasMoreElements())
  61.     {
  62.       // Use nsICookie2 to access isSession and rawHost
  63.       var nextCookie = cookieManEnum.getNext().QueryInterface(GM_CI.nsICookie2);
  64.       
  65.       if (nextCookie.host.indexOf(aHost) > -1)
  66.       {
  67.         var uri = iioServ.newURI("http://" + nextCookie.rawHost, "UTF-8", null);
  68.         var name = nextCookie.name + "=" + nextCookie.value + ";";
  69.         var type = (nextCookie.isDomain ? "Domain=" : "Host=") + nextCookie.host + ";";
  70.         var path = "Path=" + nextCookie.path + ";";
  71.         var expires = "";
  72.         
  73.         if (!nextCookie.isSession)
  74.           expires = "Expires=" + new Date(nextCookie.expires * 1000).toGMTString() + ";";
  75.         
  76.         cookies[name] = new Object();
  77.         cookies[name].cookie = name + type + path + expires;
  78.         cookies[name].uri = uri;
  79.       }
  80.     }
  81.     
  82.     /*
  83.     var cookieServ = GM_CC["@mozilla.org/cookieService;1"].getService(GM_CI.nsICookieService);
  84.     var uri = iioServ.newURI("http://.google.com", null, null);
  85.     //this._console.logStringMessage(nextCookie.rawHost + " *** " + nextCookie.host);
  86.     this._console.logStringMessage(cookieServ.getCookieString(uri, null));
  87.     */
  88.     
  89.     return cookies;
  90.   },
  91.   
  92.   _putCookies: function(aHost)
  93.   {
  94.     var cookieServ = GM_CC["@mozilla.org/cookieService;1"].getService(GM_CI.nsICookieService);
  95.     var cookieMan = GM_CC["@mozilla.org/cookiemanager;1"].getService(GM_CI.nsICookieManager);
  96.     var cookieManEnum = cookieMan.enumerator;
  97.     
  98.     // Clear current host cookies
  99.     while (cookieManEnum.hasMoreElements())
  100.     {
  101.       var nextCookie = cookieManEnum.getNext().QueryInterface(GM_CI.nsICookie2);
  102.       
  103.       if (nextCookie.host.indexOf(aHost) > -1)
  104.        cookieMan.remove(nextCookie.host, nextCookie.name, nextCookie.path, false);
  105.     }
  106.     
  107.     // Restore host cookies
  108.     for (var cookieName in this._sessions[aHost].cookies)
  109.     {
  110.       var cookie = this._sessions[aHost].cookies[cookieName].cookie;
  111.       var uri = this._sessions[aHost].cookies[cookieName].uri;
  112.       
  113.       cookieServ.setCookieString(uri, null, cookie, null);
  114.     }
  115.   },
  116.   
  117.   observe: function(aSubject, aTopic, aData)
  118.   {
  119.     var httpChannel = aSubject.QueryInterface(GM_CI.nsIHttpChannel);
  120.     var uri = httpChannel.URI;
  121.     var host = null;
  122.     
  123.     // Find matching host
  124.     for (var lookupHost in this._sessions)
  125.       if (uri.host.indexOf(lookupHost) > -1)
  126.         host = lookupHost;
  127.     
  128.     var isGood = (uri.originCharset.indexOf("gmanager") == -1 && host != null);
  129.     
  130.     if (aTopic == "http-on-modify-request" && isGood)
  131.     {
  132.       try {
  133.         httpChannel.setRequestHeader("Cookie", "", false);
  134.         
  135.         for (var cookieName in this._sessions[host].cookies)
  136.         {
  137.           var cookie = this._sessions[host].cookies[cookieName].cookie;
  138.           var cookieValue = (cookie.split(";"))[0];
  139.           var cookieHost = this._sessions[host].cookies[cookieName].uri.host;
  140.           
  141.           if (cookie.indexOf("Domain") > -1)
  142.             cookieHost = cookie.match(/\Domain=[a-zA-Z.]*;/).slice(7, -1);
  143.           else if (cookie.indexOf("Host") > -1)
  144.             cookieHost = cookie.match(/\Host=[a-zA-Z.]*;/).slice(5, -1);
  145.           
  146.           if (uri.host.indexOf(cookieHost) > -1 && cookieValue.indexOf("GV=") == -1)
  147.             httpChannel.setRequestHeader("Cookie", cookieValue + ";", true);
  148.         }
  149.       } catch(e) {}
  150.     }
  151.     else if (aTopic == "http-on-examine-response" && isGood)
  152.     {
  153.       try {
  154.         var cookies = httpChannel.getResponseHeader("Set-Cookie").split("\n");
  155.         
  156.         for (var i = 0; i < cookies.length; i++)
  157.         {
  158.           var cookieName = (cookies[i].split("="))[0];
  159.           this._sessions[host].cookies[cookieName] = new Object();
  160.           this._sessions[host].cookies[cookieName].cookie = cookies[i];
  161.           this._sessions[host].cookies[cookieName].uri = uri;
  162.         }
  163.       } catch(e) {}
  164.     }
  165.   },
  166.   
  167.   QueryInterface: function(iid)
  168.   {
  169.     if (!iid.equals(GM_CI.gmICookies) && 
  170.         !iid.equals(GM_CI.nsISupports))
  171.       throw Components.results.NS_ERROR_NO_INTERFACE;
  172.     return this;
  173.   }
  174. }
  175.  
  176. var myModule = {
  177.   firstTime: true,
  178.   
  179.   myCID: Components.ID("{81516840-f7dd-11da-974d-0800200c9a66}"),
  180.   myDesc: "Service for cookies",
  181.   myProgID: "@longfocus.com/gmanager/cookies;1",
  182.   myFactory: {
  183.     createInstance: function (outer, iid) {
  184.       if (outer != null)
  185.         throw Components.results.NS_ERROR_NO_AGGREGATION;
  186.       
  187.       return (new gmCookies()).QueryInterface(iid);
  188.     }
  189.   },
  190.  
  191.   registerSelf: function (compMgr, fileSpec, location, type)
  192.   {
  193.     if (this.firstTime) {
  194.       this.firstTime = false;
  195.       throw Components.results.NS_ERROR_FACTORY_REGISTER_AGAIN;
  196.     }
  197.     
  198.     compMgr = compMgr.QueryInterface(Components.interfaces.nsIComponentRegistrar);
  199.     compMgr.registerFactoryLocation(this.myCID, this.myDesc, this.myProgID, fileSpec, location, type);
  200.   },
  201.  
  202.   getClassObject: function (compMgr, cid, iid)
  203.   {
  204.     if (!cid.equals(this.myCID))
  205.       throw Components.results.NS_ERROR_NO_INTERFACE;
  206.     
  207.     if (!iid.equals(Components.interfaces.nsIFactory))
  208.       throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
  209.     
  210.     return this.myFactory;
  211.   },
  212.   
  213.   canUnload: function(compMgr) { return true; }
  214. };
  215.  
  216. function NSGetModule(compMgr, fileSpec) { return myModule; }